#include "CalcUI.h"

CalcUI::CalcUI(CalcInterface & calc): m_calc (&calc), m_btn_total(20)//20个按钮
{
    setWindowIcon(QIcon("://calc.ico"));
    m_line = new QLineEdit(this);

    m_btns = new QPushButton * [m_btn_total];
    for (int i = 0; i < m_btn_total; i++)
        m_btns[i] = new QPushButton(this);


    /*
    每个按钮的宽度是 85 高度是 60，一共 4 * 5 个按钮
    按钮之间的空隙是 2，宽度有5个空隙，高度有7个空隙
    LineEdit 的宽度是除去空隙的 Widget 的宽度 346，高度是剩下的高度 86

    可以定义 QGridLayout 的每个 Cell 的大小为 85*60 然后空隙都是 2 即可
    每个按钮都占用一个 Cell， LineEdit 占用
    所以，总宽度是 4*85 + 5*2 = 350; 总高度是 5*60 + 7*2 + 86 = 400
    */

    this->setWindowTitle("仿 win10 计算器");
    this->setFixedSize(350, 400);

    m_line->setFixedSize(350, 86);
    m_line->setEchoMode(QLineEdit::Normal);
    m_line->setAlignment(Qt::AlignRight);
    m_line->setStyleSheet("QLineEdit{border:0px;color:black;background:rgb(230,230,230);font:bold 48px}");
    m_line->setGeometry(2, 2, 346, 86);
    m_line->setReadOnly(true);//不允许直接编辑内容，必须通过按钮操作

    m_btns[0]->setText("+/-");
    m_btns[1]->setText("0");
    m_btns[2]->setText(".");
    m_btns[3]->setText("=");

    m_btns[4]->setText("1");
    m_btns[5]->setText("2");
    m_btns[6]->setText("3");
    m_btns[7]->setText("+");

    m_btns[8]->setText("4");
    m_btns[9]->setText("5");
    m_btns[10]->setText("6");
    m_btns[11]->setText("-");

    m_btns[12]->setText("7");
    m_btns[13]->setText("8");
    m_btns[14]->setText("9");
    m_btns[15]->setText("×");

    m_btns[16]->setText("CE");
    m_btns[17]->setText("C");
    m_btns[18]->setText("<-");
    m_btns[19]->setText("÷");

    for (int i = 0; i < m_btn_total; i ++)
    {
        QObject::connect(m_btns[i], &QPushButton::clicked, this, &CalcUI::updateLineEdit);
        //等号 的背景颜色是蓝色
        if (i == 3)
            m_btns[i]->setStyleSheet("QPushButton{border:1px;color:black;font:bold 28px;background:rgb(138,211,216);}"
                                    "QPushButton:hover{background:rgb(67,198,206);}"
                                    "QPushButton:pressed{background:rgb(52,173,180);}");
        //运算符 的背景颜色是浅灰
        else if ((i + 1) % 4 == 0 || i >= 16)
            m_btns[i]->setStyleSheet("QPushButton{border:1px;color:black;background:rgb(240,240,240);font:bold 14px;}"
                                     "QPushButton:hover{background:rgb(230,230,230);}"
                                     "QPushButton:pressed{background:rgb(220,220,220);}");


        //普通数字 的背景颜色是白色
        else
            m_btns[i]->setStyleSheet("QPushButton{border:1px;color:black;background:white;font:bold 14px;}"
                                "QPushButton:hover{background:rgb(230,230,230);}"
                                "QPushButton:pressed{background:rgb(220,220,220);}");
    }



    // 按顺序添加所有按钮
    for (int i = 0; i < m_btn_total; i++)
        m_btns[i]->setGeometry(85*(i%4) + 2*(1+i%4), 400 - 60*(1+i/4) - 2*(1+i/4), 85, 60);
}

//更新 LineEdit 中的内容，比如，可以整一个按 <- 就退格，按 CE 或 C 就清零， 按其他键正常, 并且封锁修改
void CalcUI::updateLineEdit()
{
    QPushButton * btn = dynamic_cast<QPushButton *>(QObject::sender());
    QString btn_text, line_text;

    if (btn != nullptr)
    {
        m_line->setReadOnly(false);
        btn_text = btn->text();
        line_text = m_line->text();
        if (btn_text == "<-")
        {
            if (!line_text.isEmpty())
                m_line->setText(line_text.left(line_text.length()-1));
        }
        else if (btn_text == "C" || btn_text == "CE")
            m_line->clear();
        else if (btn_text == "=")
        {
            m_calc->get_expr(line_text);
            m_line->setText(m_calc->get_result());
        }
        else // 其他正常数字
            m_line->setText(m_line->text() + btn_text);
        m_line->setReadOnly(true);
    }
}

CalcUI::~CalcUI()
{
    delete this->m_line;
    for (int i = 0; i < m_btn_total; i++)
        delete m_btns[i];
    delete m_btns;
}

void CalcUI::show()
{
   QWidget::show();
}
